function q = fdr_bh(p)
% Benjamini-Hochberg FDR (BH) adjustment.
% Input:  p = vector of p-values (can include NaN)
% Output: q = BH-adjusted q-values, same size as p

p = p(:);
q = nan(size(p));

ok = isfinite(p);
pp = p(ok);

m = numel(pp);
if m == 0
    return;
end

[ps, idx] = sort(pp, 'ascend');
qsorted = ps .* (m ./ (1:m)');

for i = m-1:-1:1
    qsorted(i) = min(qsorted(i), qsorted(i+1));
end

qsorted = min(qsorted, 1);

qq = nan(m,1);
qq(idx) = qsorted;
q(ok) = qq;

q = reshape(q, size(p));
end